<!--
 * @Author: your name
 * @Date: 2022-03-29 17:20:01
 * @LastEditTime: 2022-03-29 17:40:25
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: \geyao\geyao\组合继承220319.html
-->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>组合继承</title>
</head>
<body>
  <script>
    //定义一个父亲级别函数 里面有个name属性
    function Father(name){
  this.name = name;
  this.colors = ["red", "blue", "green"];
}
//原型上面挂载一个sayName方法
Father.prototype.sayName = function(){
  console.log(this.name);
};

function Son(name, age){
  // 继承属性
  // 第二次调用Father()
  Father.call(this, name);
  this.age = age;
}

// 继承方法
// 构建原型链
// 第一次调用Father()
Son.prototype = new Father(); 
// 重写Son.prototype的constructor属性，指向自己的构造函数Son
Son.prototype.constructor = Son; 
Son.prototype.sayAge = function(){
    console.log(this.age);
};

var instance1 = new Son("Nicholas", 29);
instance1.colors.push("black");
console.log(instance1.colors); //"red,blue,green,black"
instance1.sayName(); //"Nicholas";
instance1.sayAge(); //29

var instance2 = new Son("Greg", 27);
console.log(instance2.colors); //"red,blue,green"
instance2.sayName(); //"Greg";
instance2.sayAge(); //27
//第一次调用Father()Son.prototype写入两个属性name，color。第二次调用Father()：给instance1写入两个属性name，color。

//组合模式的缺点就是在使用子类创建实例对象时，其原型中会存在两份相同的属性/方法。
  </script>
</body>
</html>